package com.shuai.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.shuai.dao.UserDao;
import com.shuai.model.vo.ProjectVO;
import com.shuai.model.vo.UserVO;
import com.shuai.service.UserService;
import com.shuai.utils.PageUtil;
import com.shuai.utils.R;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;


@Service
public class UserServiceImpl implements UserService {

    @Resource
    private UserDao userDao;

    @Override
    public R userLoin(UserVO vo) {
        LambdaQueryWrapper<UserVO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.select(UserVO::getUserId, UserVO::getUserName, UserVO::getAccount, UserVO::getTel)
                .eq(UserVO::getAccount, vo.getAccount())
                .eq(UserVO::getPwd, vo.getPwd())
                .eq(UserVO::getDelflag, "0");
        UserVO userVO = this.userDao.selectOne(lambdaQueryWrapper);
        if (userVO != null) {
            return R.ok(userVO);
        } else {
            return R.er();
        }

    }

    @Override
    public R userList(Map<String, Object> params) {
        params = PageUtil.page(params);
        List<UserVO> userVOS = this.userDao.userList(params);

        Map<String, Object> res = this.userDao.totalSize(null);
        res.put("userList", userVOS);

        return R.ok(res);
    }

    @Override
    public R searchUser(Map<String, Object> params) {
        params = PageUtil.page(params);
        List<UserVO> userVOS = this.userDao.userList(params);
        Map<String, Object> res = this.userDao.totalSize(params);
        res.put("userList", userVOS);
        return R.ok(res);
    }

    @Override
    public R addUser(UserVO vo) {
        //TODO 根据账号验证用户的账号是否重复
        LambdaQueryWrapper<UserVO> userCheck = new LambdaQueryWrapper<>();
        userCheck.eq(UserVO::getAccount, vo.getAccount()).eq(UserVO::getDelflag, "0")
                .or().eq(UserVO::getTel, vo.getTel());
        UserVO userVO = this.userDao.selectOne(userCheck);
        if (userVO != null) {
            return R.checkError();
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        vo.setIntime(sdf.format(new Date()));
        int insert = this.userDao.insert(vo);
        if (insert > 0) {
            return R.ok();
        } else {
            return R.er();
        }
    }

    @Override
    public R userInfo(UserVO vo) {
        LambdaQueryWrapper<UserVO> userInfoQuery = new LambdaQueryWrapper<>();
        userInfoQuery.select(UserVO::getUserName, UserVO::getUserId, UserVO::getAccount, UserVO::getTel)
                .eq(UserVO::getUserId, vo.getUserId());
        UserVO userInfo = this.userDao.selectOne(userInfoQuery);
        return R.ok(userInfo);
    }

    @Override
    public R updateUser(UserVO vo) {
        LambdaQueryWrapper<UserVO> checkQueryWrapper = new LambdaQueryWrapper<>();
        if (vo.getAccount() == null && vo.getUserName() == null && vo.getTel() == null && vo.getPwd() == null) {
            return R.er();
        }
        if (vo.getAccount() != null) {
            checkQueryWrapper.ne(UserVO::getUserId, vo.getUserId());
            checkQueryWrapper.eq(UserVO::getAccount, vo.getAccount());
            UserVO userVO = this.userDao.selectOne(checkQueryWrapper);
            if (userVO != null) {
                return R.checkError();
            }
        }
        if (vo.getTel() != null) {
            checkQueryWrapper.ne(UserVO::getUserId, vo.getUserId());
            checkQueryWrapper.eq(UserVO::getTel, vo.getTel());
            UserVO userVO = this.userDao.selectOne(checkQueryWrapper);
            if (userVO != null) {
                return R.checkError();
            }
        }
        int row = this.userDao.updateUser(vo);
        if (row > 0) {
            return R.ok();
        } else {
            return R.er();
        }
    }

    @Override
    public R delUser(UserVO vo) {
        LambdaUpdateWrapper<UserVO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper.set(UserVO::getDelflag, "1");
        lambdaUpdateWrapper.eq(UserVO::getUserId, vo.getUserId());
        int row = this.userDao.update(lambdaUpdateWrapper);
        if (row > 0) {
            return R.ok();
        } else {
            return R.er();
        }
    }

    @Override
    public R userListOfManager() {
        LambdaQueryWrapper<UserVO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.select(Arrays.asList(UserVO::getUserId, UserVO::getUserName));
        lambdaQueryWrapper.ne(UserVO::getIsAdmin, 1).eq(UserVO::getDelflag, "0");
        List<UserVO> userVOS = this.userDao.selectList(lambdaQueryWrapper);
        return R.ok(userVOS);
    }

    @Override
    public R userListOfNotWork(ProjectVO vo) {
        //TODO 查询空闲人  当前用户没有任务或者任务完成度为100
        List<Map<String, Object>> userVOS = this.userDao.userListOfNotWork(vo.getProjectId());
        return R.ok(userVOS);
    }
}